{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T12:33:18.785618Z",
     "start_time": "2019-11-23T12:33:18.644021Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "from torchvision import datasets, transforms\n",
    "from torch.autograd.gradcheck import zero_gradients\n",
    "import torch.utils.data.dataloader as Data\n",
    "import torch.nn as nn\n",
    "from torchvision import models\n",
    "import numpy as np\n",
    "import cv2\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T12:20:09.415119Z",
     "start_time": "2019-11-23T12:20:09.395838Z"
    }
   },
   "outputs": [],
   "source": [
    "#对比展现原始图片和对抗样本图片\n",
    "def show_images_diff(original_img,original_label,adversarial_img,adversarial_label):\n",
    "    plt.figure()\n",
    "\n",
    "    #归一化\n",
    "    if original_img.any() > 1.0:\n",
    "        original_img=original_img/255.0\n",
    "    if adversarial_img.any() > 1.0:\n",
    "        adversarial_img=adversarial_img/255.0\n",
    "\n",
    "    plt.subplot(131)\n",
    "    plt.title('Original')\n",
    "    plt.imshow(original_img)\n",
    "    plt.axis('off')\n",
    "\n",
    "    plt.subplot(132)\n",
    "    plt.title('Adversarial')\n",
    "    plt.imshow(adversarial_img)\n",
    "    plt.axis('off')\n",
    "\n",
    "    plt.subplot(133)\n",
    "    plt.title('Adversarial-Original')\n",
    "    difference = adversarial_img - original_img\n",
    "    #(-1,1)  -> (0,1)\n",
    "    difference=difference / abs(difference).max()/2.0+0.5\n",
    "    plt.imshow(difference,cmap=plt.cm.gray)\n",
    "    plt.axis('off')\n",
    "    plt.tight_layout()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T12:20:35.051770Z",
     "start_time": "2019-11-23T12:20:35.014444Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 3, 224, 224])\n"
     ]
    }
   ],
   "source": [
    "#获取计算设备 默认是CPU\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "#图像加载以及预处理\n",
    "image_path=\"/home/schenk/lab/adversarial_examples-master/picture/cropped_panda.jpg\"\n",
    "orig = cv2.imread(image_path)[..., ::-1]   \n",
    "orig = cv2.resize(orig, (224, 224))\n",
    "img = orig.copy().astype(np.float32)\n",
    "\n",
    "mean = [0.485, 0.456, 0.406]\n",
    "std = [0.229, 0.224, 0.225]\n",
    "img /= 255.0\n",
    "img = (img - mean) / std\n",
    "img = img.transpose(2, 0, 1)  # 将原本(长，宽，通道数)的图片转成(通道数，长，宽)\n",
    "\n",
    "img=np.expand_dims(img, axis=0)\n",
    "\n",
    "img = torch.from_numpy(img).to(device).float()\n",
    "print(img.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T12:20:56.051272Z",
     "start_time": "2019-11-23T12:20:55.284189Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "label=388\n"
     ]
    }
   ],
   "source": [
    "#使用预测模式 主要影响droupout和BN层的行为\n",
    "model = models.alexnet(pretrained=True).to(device).eval()\n",
    "\n",
    "label = np.argmax(model(img).data.cpu().numpy())\n",
    "print(\"label={}\".format(label))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T12:27:12.432566Z",
     "start_time": "2019-11-23T12:27:12.427475Z"
    }
   },
   "outputs": [],
   "source": [
    "#实现saliency_map\n",
    "def saliency_map(F, x, t, mask):     \n",
    "    # 通过梯度函数，计算出对目标分类贡献最大的像素\n",
    "    F[0, t].backward(retain_graph=True)\n",
    "    derivative = x.grad.data.cpu().numpy().copy()\n",
    "    alphas = derivative * mask\n",
    "    # 记录哪些像素点被修改过\n",
    "    betas = -np.ones_like(alphas)\n",
    "\n",
    "    sal_map = np.abs(alphas) * np.abs(betas) * np.sign(alphas * betas)\n",
    "    # 找到对攻击最有利的像素点\n",
    "    idx = np.argmin(sal_map)\n",
    "\n",
    "    #转换成(p1,p2)格式      \n",
    "    idx = np.unravel_index(idx, mask.shape)\n",
    "    pix_sign = np.sign(alphas)[idx]\n",
    "\n",
    "    return idx, pix_sign"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T12:31:25.496786Z",
     "start_time": "2019-11-23T12:31:25.480274Z"
    }
   },
   "outputs": [],
   "source": [
    "#图像数据梯度可以获取\n",
    "img.requires_grad = True\n",
    "#设置为不保存梯度值 自然也无法修改\n",
    "for param in model.parameters():\n",
    "    param.requires_grad = False\n",
    "\n",
    "epochs = 500\n",
    "#扰动系数\n",
    "theta = 0.3\n",
    "#攻击目标\n",
    "target_label =227\n",
    "target = torch.Tensor([float(target_label)]).to(device).long()\n",
    "#定义边界\n",
    "max_=3.0\n",
    "min_=-3.0\n",
    "\n",
    "loss_func = torch.nn.CrossEntropyLoss()\n",
    "# the mask defines the search domain\n",
    "# each modified pixel with border value is set to zero in mask\n",
    "mask = np.ones_like(img.data.cpu().numpy())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T12:31:51.723780Z",
     "start_time": "2019-11-23T12:31:26.189296Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch=0 label=388 loss=9.582433700561523\n",
      "idx=(0, 1, 100, 124) over 3.090616226196289\n",
      "epoch=1 label=388 loss=9.641581535339355\n",
      "epoch=2 label=388 loss=9.520051956176758\n",
      "epoch=3 label=388 loss=9.423470497131348\n",
      "idx=(0, 1, 84, 124) over 3.2306723594665527\n",
      "epoch=4 label=388 loss=9.366188049316406\n",
      "idx=(0, 1, 100, 122) over 3.108123302459717\n",
      "epoch=5 label=388 loss=9.314129829406738\n",
      "epoch=6 label=388 loss=9.079380989074707\n",
      "idx=(0, 1, 100, 120) over 3.143137216567993\n",
      "epoch=7 label=388 loss=9.023985862731934\n",
      "idx=(0, 1, 87, 129) over 3.5282912254333496\n",
      "epoch=8 label=388 loss=9.05274772644043\n",
      "epoch=9 label=388 loss=9.0540189743042\n",
      "epoch=10 label=388 loss=9.120036125183105\n",
      "epoch=11 label=388 loss=9.066747665405273\n",
      "epoch=12 label=388 loss=9.045764923095703\n",
      "epoch=13 label=388 loss=9.109463691711426\n",
      "epoch=14 label=388 loss=9.174766540527344\n",
      "epoch=15 label=388 loss=9.25328254699707\n",
      "epoch=16 label=388 loss=9.211183547973633\n",
      "idx=(0, 1, 70, 163) over 3.962745189666748\n",
      "epoch=17 label=388 loss=9.082146644592285\n",
      "epoch=18 label=388 loss=9.02739429473877\n",
      "epoch=19 label=388 loss=9.086040496826172\n",
      "epoch=20 label=388 loss=9.018861770629883\n",
      "epoch=21 label=388 loss=9.096070289611816\n",
      "idx=(0, 1, 91, 125) over 3.388235330581665\n",
      "epoch=22 label=388 loss=9.165351867675781\n",
      "idx=(0, 1, 83, 129) over 3.633333206176758\n",
      "epoch=23 label=388 loss=9.182449340820312\n",
      "idx=(0, 1, 91, 130) over 3.458263397216797\n",
      "epoch=24 label=388 loss=9.235742568969727\n",
      "idx=(0, 1, 87, 124) over 3.5282912254333496\n",
      "epoch=25 label=388 loss=9.21295166015625\n",
      "idx=(0, 1, 94, 121) over 3.265686273574829\n",
      "epoch=26 label=388 loss=9.25693130493164\n",
      "epoch=27 label=388 loss=9.309738159179688\n",
      "epoch=28 label=388 loss=9.347774505615234\n",
      "epoch=29 label=388 loss=9.33871078491211\n",
      "epoch=30 label=388 loss=9.310924530029297\n",
      "epoch=31 label=388 loss=9.192081451416016\n",
      "epoch=32 label=388 loss=9.148093223571777\n",
      "epoch=33 label=388 loss=9.27834701538086\n",
      "epoch=34 label=388 loss=9.239038467407227\n",
      "epoch=35 label=388 loss=9.230081558227539\n",
      "epoch=36 label=388 loss=9.194231033325195\n",
      "epoch=37 label=388 loss=9.127406120300293\n",
      "epoch=38 label=388 loss=9.05562973022461\n",
      "idx=(0, 1, 113, 108) over 3.9452381134033203\n",
      "epoch=39 label=388 loss=9.071316719055176\n",
      "epoch=40 label=388 loss=9.111499786376953\n",
      "idx=(0, 1, 91, 132) over 3.458263397216797\n",
      "epoch=41 label=388 loss=9.119806289672852\n",
      "epoch=42 label=388 loss=8.985474586486816\n",
      "epoch=43 label=388 loss=8.962084770202637\n",
      "epoch=44 label=388 loss=8.941926002502441\n",
      "epoch=45 label=388 loss=8.899435997009277\n",
      "epoch=46 label=388 loss=8.923591613769531\n",
      "epoch=47 label=388 loss=8.990583419799805\n",
      "epoch=48 label=388 loss=9.00297737121582\n",
      "epoch=49 label=388 loss=8.935956954956055\n",
      "epoch=50 label=388 loss=8.90130615234375\n",
      "epoch=51 label=388 loss=8.911932945251465\n",
      "epoch=52 label=388 loss=8.839143753051758\n",
      "epoch=53 label=388 loss=8.80833625793457\n",
      "epoch=54 label=388 loss=8.796610832214355\n",
      "epoch=55 label=388 loss=8.779672622680664\n",
      "epoch=56 label=388 loss=8.829339027404785\n",
      "epoch=57 label=388 loss=8.757345199584961\n",
      "epoch=58 label=388 loss=8.725835800170898\n",
      "epoch=59 label=388 loss=8.6673583984375\n",
      "epoch=60 label=388 loss=8.685664176940918\n",
      "epoch=61 label=388 loss=8.504956245422363\n",
      "epoch=62 label=388 loss=8.47254753112793\n",
      "epoch=63 label=388 loss=8.442904472351074\n",
      "epoch=64 label=388 loss=8.324112892150879\n",
      "epoch=65 label=388 loss=8.267006874084473\n",
      "epoch=66 label=388 loss=8.346858024597168\n",
      "epoch=67 label=388 loss=8.407753944396973\n",
      "epoch=68 label=388 loss=8.343870162963867\n",
      "epoch=69 label=388 loss=8.369791984558105\n",
      "epoch=70 label=388 loss=8.451279640197754\n",
      "idx=(0, 1, 107, 148) over 3.2099437713623047\n",
      "epoch=71 label=388 loss=8.506152153015137\n",
      "epoch=72 label=388 loss=8.392823219299316\n",
      "epoch=73 label=388 loss=8.341670989990234\n",
      "epoch=74 label=388 loss=8.514901161193848\n",
      "epoch=75 label=388 loss=8.510071754455566\n",
      "epoch=76 label=388 loss=8.52161979675293\n",
      "epoch=77 label=388 loss=8.39738655090332\n",
      "epoch=78 label=388 loss=8.395342826843262\n",
      "epoch=79 label=388 loss=8.378264427185059\n",
      "idx=(0, 2, 113, 108) over 4.2530717849731445\n",
      "epoch=80 label=388 loss=8.369715690612793\n",
      "idx=(0, 1, 85, 98) over 3.735153913497925\n",
      "epoch=81 label=388 loss=8.304824829101562\n",
      "idx=(0, 1, 34, 114) over 3.0731091499328613\n",
      "epoch=82 label=388 loss=8.284112930297852\n",
      "epoch=83 label=388 loss=8.310867309570312\n",
      "epoch=84 label=388 loss=8.270896911621094\n",
      "idx=(0, 1, 78, 126) over 3.5282912254333496\n",
      "epoch=85 label=388 loss=8.21949291229248\n",
      "idx=(0, 1, 93, 131) over 3.5282912254333496\n",
      "epoch=86 label=388 loss=8.249673843383789\n",
      "idx=(0, 1, 94, 133) over 3.6508402824401855\n",
      "epoch=87 label=388 loss=8.2312593460083\n",
      "idx=(0, 1, 33, 116) over 3.0556023120880127\n",
      "epoch=88 label=388 loss=8.073238372802734\n",
      "idx=(0, 1, 87, 133) over 3.563305377960205\n",
      "epoch=89 label=388 loss=8.039636611938477\n",
      "idx=(0, 1, 114, 108) over 3.840196132659912\n",
      "epoch=90 label=388 loss=8.021566390991211\n",
      "epoch=91 label=388 loss=7.968005180358887\n",
      "epoch=92 label=388 loss=8.089348793029785\n",
      "epoch=93 label=388 loss=8.020913124084473\n",
      "idx=(0, 1, 84, 99) over 4.5579833984375\n",
      "epoch=94 label=388 loss=8.026034355163574\n",
      "epoch=95 label=388 loss=8.070608139038086\n",
      "idx=(0, 1, 82, 99) over 4.365406036376953\n",
      "epoch=96 label=388 loss=8.091108322143555\n",
      "epoch=97 label=388 loss=8.011377334594727\n",
      "epoch=98 label=388 loss=8.094289779663086\n",
      "epoch=99 label=388 loss=7.768458366394043\n",
      "epoch=100 label=388 loss=7.703071594238281\n",
      "epoch=101 label=388 loss=7.68973445892334\n",
      "epoch=102 label=388 loss=7.662679195404053\n",
      "epoch=103 label=388 loss=7.630350589752197\n",
      "epoch=104 label=388 loss=7.618964195251465\n",
      "epoch=105 label=388 loss=7.301796913146973\n",
      "epoch=106 label=388 loss=7.289381504058838\n",
      "epoch=107 label=388 loss=7.234299659729004\n",
      "idx=(0, 1, 71, 163) over 3.9802520275115967\n",
      "epoch=108 label=388 loss=7.096843242645264\n",
      "epoch=109 label=388 loss=7.020913124084473\n",
      "epoch=110 label=388 loss=7.011287212371826\n",
      "epoch=111 label=388 loss=7.146880149841309\n",
      "epoch=112 label=388 loss=6.95070219039917\n",
      "epoch=113 label=388 loss=7.025183200836182\n",
      "epoch=114 label=388 loss=7.112005233764648\n",
      "epoch=115 label=388 loss=7.003834247589111\n",
      "epoch=116 label=388 loss=6.857406139373779\n",
      "idx=(0, 1, 69, 162) over 3.910224199295044\n",
      "epoch=117 label=388 loss=6.79833984375\n",
      "idx=(0, 0, 98, 133) over 3.3296685218811035\n",
      "epoch=118 label=388 loss=6.855794906616211\n",
      "idx=(0, 1, 96, 132) over 3.7733893394470215\n",
      "epoch=119 label=388 loss=6.820194721221924\n",
      "epoch=120 label=388 loss=6.694796085357666\n",
      "epoch=121 label=388 loss=6.668931007385254\n",
      "idx=(0, 1, 70, 162) over 4.015266418457031\n",
      "epoch=122 label=388 loss=6.586625576019287\n",
      "epoch=123 label=388 loss=6.520745754241943\n",
      "idx=(0, 1, 78, 147) over 4.242856979370117\n",
      "epoch=124 label=388 loss=6.50342321395874\n",
      "epoch=125 label=388 loss=6.497100353240967\n",
      "idx=(0, 0, 103, 131) over 3.9994349479675293\n",
      "epoch=126 label=388 loss=6.444571495056152\n",
      "epoch=127 label=388 loss=6.400293827056885\n",
      "epoch=128 label=388 loss=6.281461238861084\n",
      "epoch=129 label=388 loss=6.037495136260986\n",
      "epoch=130 label=388 loss=5.857606887817383\n",
      "epoch=131 label=388 loss=5.663243293762207\n",
      "epoch=132 label=388 loss=5.63154935836792\n",
      "idx=(0, 0, 113, 108) over 3.656939744949341\n",
      "epoch=133 label=388 loss=5.629537582397461\n",
      "epoch=134 label=388 loss=5.552308559417725\n",
      "epoch=135 label=388 loss=5.616561412811279\n",
      "epoch=136 label=388 loss=5.63968563079834\n",
      "epoch=137 label=388 loss=5.717244625091553\n",
      "epoch=138 label=388 loss=5.620909690856934\n",
      "idx=(0, 1, 98, 54) over 3.0556023120880127\n",
      "epoch=139 label=388 loss=5.553987979888916\n",
      "epoch=140 label=388 loss=5.54406213760376\n",
      "epoch=141 label=388 loss=5.473222732543945\n",
      "epoch=142 label=388 loss=5.495950698852539\n",
      "idx=(0, 1, 77, 129) over 3.685854434967041\n",
      "epoch=143 label=388 loss=5.498632907867432\n",
      "idx=(0, 0, 78, 136) over 3.2097954750061035\n",
      "epoch=144 label=388 loss=5.5487260818481445\n",
      "idx=(0, 1, 78, 139) over 3.0030813217163086\n",
      "epoch=145 label=388 loss=5.5782341957092285\n",
      "epoch=146 label=388 loss=5.614837169647217\n",
      "idx=(0, 1, 77, 135) over 3.4757704734802246\n",
      "epoch=147 label=388 loss=5.56248664855957\n",
      "epoch=148 label=388 loss=5.537036895751953\n",
      "epoch=149 label=388 loss=5.330964088439941\n",
      "epoch=150 label=388 loss=5.32283878326416\n",
      "idx=(0, 1, 100, 108) over 3.318207263946533\n",
      "epoch=151 label=388 loss=5.323516368865967\n",
      "epoch=152 label=388 loss=5.243813991546631\n",
      "epoch=153 label=388 loss=5.260257720947266\n",
      "epoch=154 label=388 loss=5.200756072998047\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch=155 label=388 loss=5.20379638671875\n",
      "epoch=156 label=388 loss=5.2346014976501465\n",
      "idx=(0, 0, 100, 123) over 4.547427177429199\n",
      "epoch=157 label=388 loss=5.240063190460205\n",
      "epoch=158 label=388 loss=5.16538143157959\n",
      "epoch=159 label=388 loss=5.1386895179748535\n",
      "epoch=160 label=388 loss=5.108946800231934\n",
      "epoch=161 label=388 loss=5.072670936584473\n",
      "epoch=162 label=388 loss=4.979822635650635\n",
      "epoch=163 label=388 loss=4.898050785064697\n",
      "epoch=164 label=388 loss=4.851897716522217\n",
      "epoch=165 label=388 loss=4.795463562011719\n",
      "idx=(0, 1, 120, 164) over 3.490056037902832\n",
      "epoch=166 label=388 loss=4.949314117431641\n",
      "idx=(0, 1, 80, 121) over 3.108123302459717\n",
      "epoch=167 label=388 loss=4.96096658706665\n",
      "epoch=168 label=388 loss=4.929422378540039\n",
      "epoch=169 label=388 loss=4.862517356872559\n",
      "epoch=170 label=388 loss=4.8421549797058105\n",
      "epoch=171 label=388 loss=4.853830814361572\n",
      "epoch=172 label=388 loss=4.832129955291748\n",
      "epoch=173 label=388 loss=4.821652889251709\n",
      "epoch=174 label=388 loss=4.7456841468811035\n",
      "epoch=175 label=388 loss=4.730657577514648\n",
      "epoch=176 label=388 loss=4.569774150848389\n",
      "epoch=177 label=388 loss=4.417958736419678\n",
      "idx=(0, 0, 75, 165) over 3.6055655479431152\n",
      "epoch=178 label=388 loss=4.203097820281982\n",
      "epoch=179 label=388 loss=3.813129425048828\n",
      "idx=(0, 0, 74, 165) over 3.6911892890930176\n",
      "epoch=180 label=388 loss=3.609323740005493\n",
      "epoch=181 label=388 loss=3.4881319999694824\n",
      "epoch=182 label=388 loss=3.3429298400878906\n",
      "epoch=183 label=388 loss=3.3186163902282715\n",
      "epoch=184 label=388 loss=3.3179855346679688\n",
      "epoch=185 label=388 loss=3.2935311794281006\n",
      "epoch=186 label=388 loss=3.277216911315918\n",
      "epoch=187 label=388 loss=3.2419238090515137\n",
      "epoch=188 label=388 loss=3.235348701477051\n",
      "epoch=189 label=388 loss=3.2099125385284424\n",
      "epoch=190 label=388 loss=3.148749828338623\n",
      "epoch=191 label=388 loss=3.2308833599090576\n",
      "epoch=192 label=388 loss=3.1438961029052734\n",
      "epoch=193 label=388 loss=3.1003971099853516\n",
      "epoch=194 label=388 loss=3.0541176795959473\n",
      "idx=(0, 1, 88, 147) over 3.0731091499328613\n",
      "epoch=195 label=248 loss=2.939894437789917\n",
      "epoch=196 label=388 loss=2.883796453475952\n",
      "epoch=197 label=388 loss=2.855165958404541\n",
      "epoch=198 label=248 loss=2.7786331176757812\n",
      "epoch=199 label=248 loss=2.775397300720215\n",
      "epoch=200 label=248 loss=2.7546887397766113\n",
      "epoch=201 label=248 loss=2.7520761489868164\n",
      "epoch=202 label=248 loss=2.7603440284729004\n",
      "idx=(0, 1, 143, 162) over 4.365406036376953\n",
      "epoch=203 label=248 loss=2.7540030479431152\n",
      "epoch=204 label=248 loss=2.7089672088623047\n",
      "epoch=205 label=248 loss=2.689363479614258\n",
      "epoch=206 label=248 loss=2.6603381633758545\n",
      "epoch=207 label=248 loss=2.646315574645996\n",
      "epoch=208 label=248 loss=2.6430580615997314\n",
      "idx=(0, 0, 106, 105) over 4.033684730529785\n",
      "epoch=209 label=248 loss=2.6204965114593506\n",
      "epoch=210 label=248 loss=2.6222405433654785\n",
      "epoch=211 label=248 loss=2.675572633743286\n",
      "epoch=212 label=248 loss=2.6819396018981934\n",
      "epoch=213 label=248 loss=2.5951380729675293\n",
      "epoch=214 label=248 loss=2.5909366607666016\n",
      "idx=(0, 0, 112, 105) over 3.0575733184814453\n",
      "epoch=215 label=248 loss=2.5813162326812744\n",
      "epoch=216 label=248 loss=2.570061206817627\n",
      "epoch=217 label=248 loss=2.5506694316864014\n",
      "epoch=218 label=248 loss=2.557488441467285\n",
      "epoch=219 label=248 loss=2.4449944496154785\n",
      "epoch=220 label=248 loss=2.453941583633423\n",
      "epoch=221 label=248 loss=2.451636552810669\n",
      "epoch=222 label=248 loss=2.4227280616760254\n",
      "epoch=223 label=248 loss=2.390960931777954\n",
      "epoch=224 label=248 loss=2.3530383110046387\n",
      "epoch=225 label=248 loss=2.3147497177124023\n",
      "idx=(0, 0, 107, 146) over 3.2630703449249268\n",
      "epoch=226 label=248 loss=2.2754361629486084\n",
      "epoch=227 label=248 loss=2.267451047897339\n",
      "epoch=228 label=248 loss=2.230260133743286\n",
      "idx=(0, 1, 99, 108) over 3.160644292831421\n",
      "epoch=229 label=248 loss=2.2333662509918213\n",
      "epoch=230 label=248 loss=2.226848840713501\n",
      "epoch=231 label=248 loss=2.198805570602417\n",
      "epoch=232 label=248 loss=2.211827278137207\n",
      "epoch=233 label=248 loss=2.1893506050109863\n",
      "idx=(0, 1, 91, 131) over 3.458263397216797\n",
      "epoch=234 label=248 loss=2.2006378173828125\n",
      "idx=(0, 1, 98, 142) over 3.3532214164733887\n",
      "epoch=235 label=248 loss=2.157585620880127\n",
      "epoch=236 label=248 loss=2.2088091373443604\n",
      "epoch=237 label=248 loss=2.1785576343536377\n",
      "epoch=238 label=248 loss=2.215242862701416\n",
      "epoch=239 label=248 loss=2.1848978996276855\n",
      "epoch=240 label=248 loss=2.1779394149780273\n",
      "idx=(0, 1, 34, 116) over 3.038095235824585\n",
      "epoch=241 label=248 loss=2.150043487548828\n",
      "epoch=242 label=248 loss=2.1206510066986084\n",
      "epoch=243 label=248 loss=2.1125996112823486\n",
      "epoch=244 label=248 loss=2.103268623352051\n",
      "epoch=245 label=248 loss=2.0324676036834717\n",
      "epoch=246 label=248 loss=2.0395662784576416\n",
      "epoch=247 label=248 loss=2.0202205181121826\n",
      "epoch=248 label=248 loss=2.013671398162842\n",
      "idx=(0, 0, 76, 134) over 4.598801612854004\n",
      "epoch=249 label=248 loss=2.011793613433838\n",
      "epoch=250 label=248 loss=2.0124435424804688\n",
      "epoch=251 label=248 loss=2.0322961807250977\n",
      "epoch=252 label=248 loss=2.0483038425445557\n",
      "epoch=253 label=248 loss=1.9962650537490845\n",
      "epoch=254 label=248 loss=1.9111274480819702\n",
      "epoch=255 label=248 loss=1.8469743728637695\n",
      "epoch=256 label=248 loss=1.8131054639816284\n",
      "epoch=257 label=248 loss=1.7840144634246826\n",
      "epoch=258 label=248 loss=1.762615442276001\n",
      "epoch=259 label=248 loss=1.7648037672042847\n",
      "epoch=260 label=248 loss=1.7441693544387817\n",
      "idx=(0, 2, 76, 36) over 3.185098171234131\n",
      "epoch=261 label=248 loss=1.7722593545913696\n",
      "epoch=262 label=248 loss=1.746650218963623\n",
      "epoch=263 label=248 loss=1.7585759162902832\n",
      "epoch=264 label=248 loss=1.7313753366470337\n",
      "epoch=265 label=248 loss=1.775899887084961\n",
      "epoch=266 label=248 loss=1.732680320739746\n",
      "epoch=267 label=248 loss=1.7274258136749268\n",
      "idx=(0, 1, 76, 134) over 3.1256303787231445\n",
      "epoch=268 label=248 loss=1.7376712560653687\n",
      "epoch=269 label=248 loss=1.6903557777404785\n",
      "epoch=270 label=248 loss=1.6144676208496094\n",
      "idx=(0, 1, 75, 133) over 4.628011226654053\n",
      "epoch=271 label=248 loss=1.6130750179290771\n",
      "idx=(0, 0, 79, 134) over 3.432417154312134\n",
      "epoch=272 label=248 loss=1.5939898490905762\n",
      "idx=(0, 1, 78, 135) over 3.633333206176758\n",
      "epoch=273 label=248 loss=1.5799548625946045\n",
      "epoch=274 label=248 loss=1.5702357292175293\n",
      "epoch=275 label=248 loss=1.5733232498168945\n",
      "epoch=276 label=248 loss=1.5791199207305908\n",
      "epoch=277 label=248 loss=1.5965160131454468\n",
      "epoch=278 label=248 loss=1.6208648681640625\n",
      "epoch=279 label=248 loss=1.6091371774673462\n",
      "idx=(0, 1, 67, 81) over 3.612605094909668\n",
      "epoch=280 label=248 loss=1.582136869430542\n",
      "epoch=281 label=248 loss=1.5626027584075928\n",
      "epoch=282 label=248 loss=1.5606026649475098\n",
      "epoch=283 label=248 loss=1.528145670890808\n",
      "epoch=284 label=248 loss=1.5070695877075195\n",
      "epoch=285 label=248 loss=1.4915215969085693\n",
      "epoch=286 label=248 loss=1.480563759803772\n",
      "epoch=287 label=248 loss=1.4762187004089355\n",
      "epoch=288 label=248 loss=1.4970711469650269\n",
      "epoch=289 label=248 loss=1.4594602584838867\n",
      "epoch=290 label=248 loss=1.454863429069519\n",
      "epoch=291 label=248 loss=1.4580388069152832\n",
      "epoch=292 label=248 loss=1.4686787128448486\n",
      "epoch=293 label=248 loss=1.4700462818145752\n",
      "epoch=294 label=248 loss=1.4400546550750732\n",
      "epoch=295 label=248 loss=1.4303274154663086\n",
      "idx=(0, 1, 35, 115) over 3.0030813217163086\n",
      "epoch=296 label=248 loss=1.309250831604004\n",
      "epoch=297 label=248 loss=1.3187487125396729\n",
      "epoch=298 label=248 loss=1.265275001525879\n",
      "epoch=299 label=248 loss=1.259796380996704\n",
      "epoch=300 label=248 loss=1.2405576705932617\n",
      "epoch=301 label=248 loss=1.2033531665802002\n",
      "epoch=302 label=248 loss=1.2068216800689697\n",
      "epoch=303 label=248 loss=1.184780478477478\n",
      "epoch=304 label=248 loss=1.180753231048584\n",
      "epoch=305 label=248 loss=1.1914329528808594\n",
      "idx=(0, 1, 74, 127) over 3.458263397216797\n",
      "epoch=306 label=248 loss=1.1791502237319946\n",
      "epoch=307 label=248 loss=1.129429578781128\n",
      "epoch=308 label=248 loss=1.1186623573303223\n",
      "epoch=309 label=248 loss=1.1038036346435547\n",
      "epoch=310 label=248 loss=1.086092472076416\n",
      "idx=(0, 0, 75, 166) over 3.6055655479431152\n",
      "epoch=311 label=248 loss=1.04047691822052\n",
      "epoch=312 label=248 loss=1.0170540809631348\n",
      "epoch=313 label=248 loss=1.0195032358169556\n",
      "epoch=314 label=248 loss=1.0245338678359985\n",
      "epoch=315 label=248 loss=1.0140595436096191\n",
      "epoch=316 label=227 loss=0.9826738238334656\n"
     ]
    }
   ],
   "source": [
    "for epoch in range(epochs):\n",
    "\n",
    "    # forward\n",
    "    output = model(img)\n",
    "\n",
    "    label = np.argmax(output.data.cpu().numpy())\n",
    "    loss = loss_func(output, target)\n",
    "    print(\"epoch={} label={} loss={}\".format(epoch, label, loss))\n",
    "\n",
    "    #如果定向攻击成功\n",
    "    if label == target_label:\n",
    "        break\n",
    "\n",
    "    #梯度清零\n",
    "    zero_gradients(img)\n",
    "\n",
    "    idx, pix_sign = saliency_map(output, img, target_label, mask)\n",
    "\n",
    "    # apply perturbation\n",
    "    img.data[idx] = img.data[idx] + pix_sign * theta * (max_ - min_)\n",
    "\n",
    "    #达到极限的点不再参与更新\n",
    "    if (img.data[idx] <= min_) or (img.data[idx] >= max_):\n",
    "        print(\"idx={} over {}\".format(idx, img.data[idx]))\n",
    "        mask[idx] = 0\n",
    "        img.data[idx] = np.clip(img.data[idx], min_, max_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-11-23T12:33:23.394717Z",
     "start_time": "2019-11-23T12:33:23.233072Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3, 224, 224)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "adv = img.data.cpu().numpy()[0]\n",
    "print(adv.shape)\n",
    "adv = adv.transpose(1, 2, 0)\n",
    "adv = (adv * std) + mean\n",
    "\n",
    "adv = adv * 256.0\n",
    "adv = np.clip(adv, 0, 255).astype(np.uint8)\n",
    "\n",
    "show_images_diff(orig, label, adv, target_label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
